use colored::*;
use std::process::Command;

/// 检查Flutter项目
pub fn check_flutter(skip_format: bool, skip_analyze: bool) -> bool {
    // 1. 获取暂存的Dart文件
    let staged_files = get_staged_dart_files();
    
    if staged_files.is_empty() {
        println!("{}", "  ℹ️  没有Dart文件变更".yellow());
        return true;
    }

    println!("  📝 发现 {} 个Dart文件变更", staged_files.len());
    
    // 2. 代码格式化
    if !skip_format {
        if !format_code(&staged_files) {
            return false;
        }
    } else {
        println!("  ⏭️  跳过代码格式化");
    }

    // 3. 静态分析
    if !skip_analyze {
        if !analyze_code() {
            return false;
        }
    } else {
        println!("  ⏭️  跳过静态分析");
    }

    true
}

/// 获取暂存的Dart文件列表
fn get_staged_dart_files() -> Vec<String> {
    let output = Command::new("git")
        .args(["diff", "--cached", "--name-only", "--diff-filter=ACM"])
        .output()
        .expect("执行git命令失败");
    
    String::from_utf8_lossy(&output.stdout)
        .lines()
        .filter(|f| f.ends_with(".dart"))
        .map(String::from)
        .collect()
}

/// 格式化Dart代码
fn format_code(files: &[String]) -> bool {
    println!("{}", "  📝 格式化Dart代码...".yellow());
    
    let status = Command::new("dart")
        .arg("format")
        .args(files)
        .status();

    match status {
        Ok(s) if s.success() => {
            // 重新添加格式化后的文件到暂存区
            let add_status = Command::new("git")
                .arg("add")
                .args(files)
                .status();

            if add_status.is_ok() && add_status.unwrap().success() {
                println!("{}", "  ✅ 代码格式化完成".green());
                true
            } else {
                eprintln!("{}", "  ❌ git add失败".red());
                false
            }
        }
        Ok(_) => {
            eprintln!("{}", "  ❌ 代码格式化失败".red());
            false
        }
        Err(e) => {
            eprintln!("{}", format!("  ❌ 执行dart format失败: {}", e).red());
            eprintln!("{}", "  💡 请确保已安装Dart SDK".yellow());
            false
        }
    }
}

/// 运行静态分析
fn analyze_code() -> bool {
    println!("{}", "  🔍 运行Flutter静态分析...".yellow());
    
    let status = Command::new("flutter")
        .arg("analyze")
        .status();

    match status {
        Ok(s) if s.success() => {
            println!("{}", "  ✅ 静态分析通过".green());
            true
        }
        Ok(_) => {
            eprintln!("{}", "  ❌ 静态分析发现问题".red());
            eprintln!("{}", "  💡 请修复上述问题后再提交".yellow());
            false
        }
        Err(e) => {
            eprintln!("{}", format!("  ❌ 执行flutter analyze失败: {}", e).red());
            eprintln!("{}", "  💡 请确保已安装Flutter SDK".yellow());
            false
        }
    }
}

/// 运行Flutter测试
pub fn run_tests() -> bool {
    let status = Command::new("flutter")
        .arg("test")
        .status();

    match status {
        Ok(s) if s.success() => {
            println!("{}", "  ✅ 所有测试通过".green());
            true
        }
        Ok(_) => {
            eprintln!("{}", "  ❌ 测试失败".red());
            eprintln!("{}", "  💡 请修复失败的测试后再推送".yellow());
            false
        }
        Err(e) => {
            eprintln!("{}", format!("  ❌ 执行flutter test失败: {}", e).red());
            eprintln!("{}", "  💡 如果项目没有测试，请使用 --skip-test 跳过".yellow());
            false
        }
    }
}